//
//  main.m
//  03-集合
//
//  Created by dllo on 16/7/6.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    // 1. 数组
    // 数组： 可变数组 NSMutableArray 与 不可变数组NSArray
    // 数组主要是有序的存放元素的集合类型。并且可以通过下标取值。

    // 数组中只能存放对象类型
    
    // 不可变数组 只能取值
    // 可变数组 可以进行增，删，该的操作
    
   // 不可变数组
   // 2> 初始化数组
    // <1> 初始化方法 initWithObjects 后面填入的参数一定是对象类型
    // 可变参数 链表（后续讲）
    // 初始化结束， 以nil为判别标准
    NSArray *array = [[NSArray alloc] initWithObjects:@"123",nil,@"234",@"345",@"456", nil];
    NSLog(@"Array = %@",array);
    //<2>构造器方法
    NSArray *arr = [NSArray arrayWithObjects:@"123",nil,@"234",@"345",@"456", nil];
    NSLog(@"arr = %@",arr);
    //<3>字面量 同 NSString @“” NSNumer @（）
    //  NSArray @[]
    
    //三种初始化方式，推荐使用字面量。
   // 字面量可以识别，对象是否为空值；但一般的初始化方法不可以。
    // 如果为空，字面量会崩溃 -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'

   // 但是，初始化方法会识别nil为结束，并不会产生问题，造成数据丢失。
//    NSObject *objc = nil;
//    NSArray *myArray = @[@"123",objc,@"234",@"345",@"456"];
//    NSLog(@"myArray = %@",myArray);
    
  //3> 取值相关
  // <1> count 取得数组中元素个数
    NSLog(@"%ld",arr.count);
    // <2> 数组中取值，通过下标去取值
  NSString *numberString = [arr objectAtIndex:0];
    //<3> 语法糖 取值方式 快捷取值
   NSString *numberStr = arr[0];
   //<4> 根据值去取对应下标
    NSInteger indexOfObject = [arr indexOfObject:@"123"];
    NSLog(@"%ld",indexOfObject);
    //<5>判断对象是否存在数组中
    BOOL isHaveObject = [arr containsObject:@"123"];
    NSLog(@"%@",isHaveObject ? @"YES":@"NO");
    // <6> 取数组中第0位元素 ／ 取数组中最后一个元素（如果数组为空，返回的对象为空，并且不会崩溃）
    [arr firstObject];
    [arr lastObject];
    
    //4> 不可变数组，改变数组(会生成新的数组，不会在原数组基础上修改)
    // 1> 数组添加一个新的元素
   arr = [arr arrayByAddingObject:@"234"];
    NSLog(@"arr = %@",arr);
   // 2> 数组添加另外一个数组的所有元素
    arr  = [arr arrayByAddingObjectsFromArray:array];
    NSLog(@"arr = %@",arr);

    
   //可变数组
//    NSMutableArray
  // 1> 初始化方法 同 不可变数组 一样
   //遇到可变数组， 只能使用初始化方法或者便利构造器
  // 字面量创建方法， 不推荐使用
    NSMutableArray *mutableArray = [@[] mutableCopy];
  // 2> 取值方式与不可变数组 一样
  // 3> 可变数组的改变
  // <1> 数组中添加元素 addObject
    [mutableArray addObject:@"123"];
  // <2> 数组中插入元素 insertObject
    [mutableArray insertObject:@"含蓄" atIndex:0];
  // <3> 移除 第0个元素
    [mutableArray removeObjectAtIndex:0];
//   // 移除最后一个元素
//     [mutableArray removeLastObject];
//   // 移除全部
//    [mutableArray removeAllObjects];
   // <4> 替换 （使用替换时， 数组对应位置不能为空）
    [mutableArray replaceObjectAtIndex:0 withObject:@"韩旭"];
    NSLog(@"mutableArray = %@",mutableArray);
    
   // 可变 与 不可变的区别
   // 1. 可变时可以修改的，但不可变不可以。
   // 2. 不可变调用改变的方法时，会生成对象；可变调用改变方法时，在对象本身上进行修改
   // 3. 可变 继承与 不可变
    
   // 将字符串根据某个子串， 截取成数组、
   // 子串消失
   // 根据哪个子串截取，哪个子串就会消失
    NSString *urlString = @"www.a123cb.com";
  NSArray *urlArray = [urlString componentsSeparatedByString:@"."];
    NSLog(@"urlArray = %@",urlArray);
    
  //根据某个字符串， 把数组拼接成一个字符串
    NSArray *nameArray = @[@"韩旭",@"隔壁",@"老黄"];
   NSString *nameString = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"nameString = %@",nameString);
    
    return 0;
}
